<?php

namespace tlan_turing\app\mapper;

use think\App;
use think\db\Query;
use think\facade\Db;
use think\exception\ValidateException;
use think\Request;

trait TraitMapper
{

    protected array $where = [];

    protected Request $request;

    protected array $except = ['page' , 'page_size'];

    # 查询需求内容
    protected array $with = [];
    # 页码
    protected int $page = 1;
    # 条数
    protected int $pageSize = 10;


    public function __construct( protected App $app)
    {
        $this->request = $this->app->request;

        $this->where   =    $this->HandleWhere( $this->request->param());

        if (empty($this->with))
        {

            $this->with = array_keys($this->where);
        }
    }

    private function HandleWhere( ?array $where)
    {

        $this->page         = $this->request->get('page/d' , 1);
        $this->pageSize     = $this->request->get('page_size/d' , 10);
        return $this->where = $this->request->except($this->except);
    }


    /**
     *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
     *   查询列表
     *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
     * @func   getPageLists
     * @Time 2024年09月13日 17:56:46
     * @Author Xiaobin
     * @param array|null $where
     * @param array|null $order
     * @return Query
     */
    public   function getPageList( ?array $where = [] , ?array $order = []) : Query
    {

        return $this->model
            ->withSearch( $this->with , $this->request->only($this->with) )
            ->order($order)
            ->limit( ($this->page - 1) * $this->pageSize , $this->pageSize );
    }

    /**
     *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
     *   查询已删除后的数据
     *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
     * @func   realPageList
     * @Time 2024年09月13日 18:10:57
     * @Author Xiaobin
     * @param array|null $where
     * @param array|null $order
     * @return Query
     */
    public function getPageListByRecycle( ?array $where = [] , ?array $order = []) : Query
    {
        return  $this->model
            ->withSearch( $this->with , $this->request->only($this->with) )
            ->limit( ($this->page - 1) * $this->pageSize , $this->pageSize )
            # 仅查询软删除的数据
            ->onlyTrashed();
    }

    /**
     *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
     *   新增参数
     *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
     * @func   save
     * @Time 2024年09月13日 17:57:02
     * @Author Xiaobin
     * @param array|null $param
     * @return bool
     */
    public function save( ? array $param = []) : bool
    {
        $param = empty($param) ?  $this->request->post() : $param;
        return $this->model->save($param);
    }

    /**
     *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
     *   批量新增
     *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
     * @func   saveAll
     * @Time 2024年09月13日 18:31:57
     * @Author Xiaobin
     * @return void
     */
    public function saveAll( ? array $params ) : bool
    {
        $param = empty($param) ?  $this->request->post() : $param;
        return $this->model->limit(100) -> saveAll($param);
    }
    /**
     *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
     *   更新内容
     *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
     * @func   update
     * @Time 2024年09月13日 17:57:09
     * @Author Xiaobin
     * @param int $id   主键id
     * @param array|null $param
     * @return bool
     */
    public function update( int $id , ?array $param = []) : mixed
    {
        $param = empty($param) ?  $this->request->put() : $param;
        $model = $this->model->findOrEmpty($id);
        if($model->isEmpty()) throw new ValidateException('数据内容不存在');
        $model->save($param);
        return $model->save($param) ? $model : false;
    }



    /**
     *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
     *   删除 | 真删除数据
     *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
     * @func   delete
     * @Time 2024年09月13日 17:57:33
     * @Author Xiaobin
     * @param int $id
     * @return void
     */
    public function delete( mixed $id ) : mixed
    {
        if(is_array($id)){
            return $this->model->force()->destroy($id , true);
        }
        $model = $this->model->withTrashed()->findOrEmpty($id);
        if($model->isEmpty()) throw new ValidateException('数据内容不存在');
        $model->force()->delete();
        return $model;
    }


    /**
     *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
     *   软删除数据
     *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
     * @func   realDelete
     * @Time 2024年09月13日 18:10:42
     * @Author Xiaobin
     * @param int $id
     * @return bool
     */
    public function realDelete( mixed $id) : bool
    {
        if(is_array($id)){
            return $this->model->destroy($id);
        }
        $model = $this->model->findOrEmpty($id);
        if($model->isEmpty()) throw new ValidateException('数据内容不存在');
        return $model->delete();
    }


    public function restore(mixed $id)  : bool
    {
        if(is_array($id))
        {
            // 启动事务
            Db::startTrans();
            $restore = [];
            foreach ($id as  $ids)
            {
                $model = $this->model->onlyTrashed()->findOrEmpty($ids);
                $restore[] = $model->restore();
            }

            if(false === $restore) {
                // 回滚事务
                Db::rollback();
                return false;
            }
            // 提交事务
            Db::commit();
            return true;

        }
        $model = $this->model->onlyTrashed()->findOrEmpty($id);
        return $model->restore();
    }
}